---
sidebar_position: 1
---

# Наследование

Язык C++ позволяет классу наследовать переменные-члены и методы одного или нескольких других классов. Новый класс называют **производным классом**. Класс, элементы которого наследуются производным классом, называется **базовым классом**. В свою очередь производный класс может служить базовым для другого класса. Общий вид наследования:

```cpp
class Base {
  // ...
};
class Derived : <ключ доступа> Base {
  // ...
};
```

Ключ доступа может быть `private`, `protected`, `public`. Если ключ не указан, то по умолчанию он принимается `private`.

Наследование даст возможность заключить некоторое общее или схожее поведение различных объектов в одном базовом классе.

Наследование позволяет также изменить поведение существующего класса. Производный класс может переопределить некоторые методы базового, наследуя, тем не менее, основной объем свойств и атрибутов базового класса. С помощью наследования может быть создана иерархия классов, которые совместно используют код и интерфейсы.

Наследуемые компоненты не перемещаются в производный класс, а остаются в базовых классах.

В иерархии производный объект наследует разрешенные для наследования компоненты всех базовых объектов (`public`, `protected`).

Допускается множественное наследование - возможность для некоторого класса наследовать компоненты нескольких никак не связанных между собой базовых классов. В иерархии классов соглашение относительно доступности компонентов класса следующее:

- `private` - член класса может использоваться только функциями-членами данного класса и функциями-"друзьями" своего класса. В производном классе он недоступен.
- `protected` - то же, что и `private`, но дополнительно член класса с данным атрибутом доступа может использоваться функциями-членами и функциями-"друзьями" классов, производных от данного (при наследовании `public` и `protected`).
- `public` - член класса может использоваться любой функцией, которая является членом данного или производного класса, а также к `public` - членам возможен доступ извне через имя объекта (при наследовании `public` и `protected`).

Следует иметь в виду, что объявление `friend` не является атрибутом доступа и не наследуется.

Наследование позволяет рассматривать целые иерархии классов и работать со всеми элементами одинаково, приводя их к базовому. Правила приведения следующие:

- наследуемый класс всегда можно привести к базовому;
- базовый класс можно привести к наследуемому, только если в действительности это объект наследуемого класса.

Ошибки приведения базового класса к наследуемому отслеживаются программистом.

Синтаксис определения производного класса:

```cpp
class имя_класса : список_базовых_классов {список_компонентов_класса};
```

В приведенном ниже примере показано определение наследования классов и доступа к членам базового класса через объект производного класса:

```cpp
#include <iostream>

using namespace std;

class Base {
 public:
  int n;
  int count() { return ++n; }
};

class Derived : public Base {
 public:
  int m;
  int discount() { return --m; }
};

int main() {
  setlocale(LC_ALL, "Russian");
  Derived d;
  d.n = 10;
  cout << d.count() << endl;
  d.m = 20;
  cout << d.discount() << endl;
  return 0;
}
```
